﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SuperKit
{
    /*
     * 这个项目给当前目录下，以及所有子目录下面的文件进行编号。把文件名都改成0001.jpg，0002.jpg这样的文件。
     * 这个是为了处理有些目录下面的文件名太长了，导致出现问题。以及快速的编辑。
     */
    class FullNumberize : CommandExecutor {
        // 如果这个项目为TRUE，表示处理所有的文件。默认情况下，只处理图片文件。
        public bool IsAll { get; }
        // 给文件增加的前缀
        public string prefix { get; }

        public FullNumberize(ArgReader arg, IExecutorOwner form, string fpath) : base(arg, form, fpath) {
            IsAll = arg.IsContain("-all");
            prefix = arg.GetParameter("-prefix");
        }

        public override void Execute() {
            base.Execute();
            DirectoryInfo info = new DirectoryInfo(FilePath);
            var dirs = Kit.GetAllDirectories(null, info);
            foreach (var i in dirs) {
                Process(i);
            }

            End();
        }

        private void Process(DirectoryInfo dir) {
            int index = 1;
            var files = dir.GetFiles().OrderBy(f => f.Name);
            var digit = GetDigit(files.Count());

            foreach (var i in files) {
                if (IsAll == false) { // 如果不是全部，跳过非图片文件
                    if (Kit.IsFileType(i, Kit.IMG_EXTS) == false) {
                        continue;
                    }
                }

                var name = $"{NumberToString(index++, digit)}{Path.GetExtension(i.Name)}";
                if (!Kit.IsEmpty(prefix)) {
                    name = prefix + "_" + name;
                }
                var path = Path.Combine(dir.FullName, name);

                if (!File.Exists(path)) {
                    try {
                        File.Move(i.FullName, path);
                    }catch (Exception e) {
                        Flush(e.Message);
                    }
                    
                }
            }
        }

        // 获取一个数的位数
        private int GetDigit(int size) {
            for (int i = 1; i < 10; i++) {
                if (size < (int)Math.Pow(10, i)) {
                    return i;
                }
            }
            return 1;
        }

        private string NumberToString(int num, int digit) {
            return num.ToString("D" + digit);
        }

    }
}
